package org.finegold.core.netty.props;

import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * WebSocket服务端通道配置
 * @author songkaikai
 * @since 2021/1/21
 */
@ConfigurationProperties(prefix = "fine.netty.server-channel")
@ConditionalOnProperty(value = "fine.netty.enabled", havingValue = "true")
@Data
public class ServerChannelProperties {

    /**
     * TCP数据接收缓冲区大小。该缓冲区即TCP接收滑动窗口，
     * linux操作系统可使用命令：cat /proc/sys/net/ipv4/tcp_rmem查询其大小。
     */
    private Integer soRcvbuf = 4096;

    /**
     * 地址复用，默认值False。
     * 有四种情况可以使用：
     * (1).当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时，
     *       而你希望启动的程序的socket2要占用该地址和端口，比如重启服务且保持先前端口。
     * (2).有多块网卡或用IP Alias技术的机器在同一端口启动多个进程，但每个进程绑定的本地IP地址不能相同。
     * (3).单个进程绑定相同的端口到多个socket上，但每个socket绑定的ip地址不同。
     * (4).完全相同的地址和端口的重复绑定。但这只用于UDP的多播，不用于TCP
     */
    private Boolean soReuseaddr = false;

    /**
     * 服务端接受连接的队列长度，如果队列已满，客户端连接将被拒绝。默认值，Windows为200，其他为128。
     */
    private Integer soBacklog = System.getProperty("os.name").toLowerCase().startsWith("win") ? 200 : 128;

}
